package org.zoomdev.zoom.ioc.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


/**
 * 假如某一个类使用这个字段,则表示自动映射配置文件中对应的字段
 *
 * @Config(file="app.properties",key="app") class AppConfig{
 * String url
 * String name
 * }
 * <p>
 * 存在app.properties文件
 * app.url=http://www.app.com
 * app.name=牛pp
 * <p>
 * 则在可以在module中使用
 * @Module class AModule{
 * // 无需inject,写上也没关系
 * private AppConfig app;
 * }
 * @Module class BModule{
 * @Init void config(AppConfig app){
 * <p>
 * }
 * }
 * @Module
 * @Config(file="app.properties",key="app") class CModule{
 * String url
 * String name
 * }
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
public @interface Config {


    /**
     * 指定config文件,可以在jar中存在,如： module-config.properties
     * 支持 *.properties的设定,表示合并所有配置
     * a*.properties ,表示合并a开头的配置文件的配置
     *
     * @return
     * @see org.zoomdev.zoom.common.filter.pattern.PatternFilter
     * @see org.zoomdev.zoom.common.filter.pattern.PatternFilterFactory
     */
    String file() default "";


    /**
     * 假如不为空,则表示 前缀,如
     *
     * @return
     * @Config(key="a") class A{
     * String name;
     * }
     * <p>
     * 则  A.a 会映射 application.properties的 a.name
     */
    String key() default "";
}
